`timescale 1ns/1ps
module circuit_8x2_top;
    reg [15:0]in16;
    wire [2:0]Z0,Z1,Z2,Z3;
    wire [1:0]out;

    initial begin
        in16 = 16'b1010_1101_0010_0110;
        # 4 in16 = 16'b1111_1010_1100_0000;
        # 4 in16 = 16'b0010_0101_0101_0101;
        # 4 $stop;
    end
    circuit_8x2 c82(Z0,Z1,Z2,Z3,out,in16);
initial
  	begin
    	$dumpfile("test.vcd");
    	$dumpvars(0, c82);
  	end 
endmodule

module circuit_8x2(Z0,Z1,Z2,Z3,out,in16);
    input [15:0]in16;
    output [2:0]Z0,Z1,Z2,Z3;
    output [1:0]out;
    wire [2:0]max,max1,max2;
    assign Z0 = (in16[1:0]==2'b00)+(in16[3:2]==2'b00)+
        (in16[5:4]==2'b00)+(in16[7:6]==2'b00)+(in16[9:8]==2'b00)+(in16[11:10]==2'b00)+(in16[13:12]==2'b00)+(in16[15:14]==2'b00);
    assign Z1 = (in16[1:0]==2'b01)+(in16[3:2]==2'b01)+
        (in16[5:4]==2'b01)+(in16[7:6]==2'b01)+(in16[9:8]==2'b01)+(in16[11:10]==2'b01)+(in16[13:12]==2'b01)+(in16[15:14]==2'b01);
    assign Z2 = (in16[1:0]==2'b10)+(in16[3:2]==2'b10)+
        (in16[5:4]==2'b10)+(in16[7:6]==2'b10)+(in16[9:8]==2'b10)+(in16[11:10]==2'b10)+(in16[13:12]==2'b10)+(in16[15:14]==2'b10);
    assign Z3 = (in16[1:0]==2'b11)+(in16[3:2]==2'b11)+
        (in16[5:4]==2'b11)+(in16[7:6]==2'b11)+(in16[9:8]==2'b11)+(in16[11:10]==2'b11)+(in16[13:12]==2'b11)+(in16[15:14]==2'b11);
    assign max1 = (Z0>Z1)?Z0:Z1;
    assign max2 = (Z2>Z3)?Z2:Z3;
    assign max = (max1>max2)?max1:max2;
    assign out = (max==Z0)?2'b00:
        (max == Z1)?2'b01:
        (max == Z2)?2'b10:2'b11;
endmodule
